 
  

 






<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=234 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:08 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
<head>
 <title>
  Java Practices -> Use a fake system clock
 </title>
 <link rel="stylesheet" type="text/css" href="../stylesheet8.css" media="all">
 
 <link rel="shortcut icon" href='../images/favicon.ico' type="image/vnd.microsoft.icon">
 <meta name="description" content="Concise presentations of java programming practices, tasks, and conventions, amply illustrated with syntax highlighted code examples.">
 
 <meta name='keywords' content='java,java programming,java practices,java idiom,java style,java design patterns,java coding conventions,'>
 
 
</head>
 
<body>


<div class='menu-bar'>
 
  <a href='../home/HomeAction.html' title='Table of Contents'>Home</a> |
  <a href='../vote/VoteSummaryAction-2.html' title='View Poll Results'>Poll</a> |
   
  <A href='../feedback/FeedbackAction451f-2.html?Operation=Show' title='Send Your Feedback'>Wiki</a> |
  <b><a href='../source/SourceAction-2.html' title='Grab Source Code'>Source Code</a></b><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |

  <a href='http://www.web4j.com/Java_Web_Application_Framework_Overview.jsp?From=1' title='Free Download - Java Web Application Framework'><b>WEB4J</b></a> |
  
  <a href='http://www.date4j.net/' title='Replacement for java.util.Date'><b>DATE4J</b></a> |

   <a href='../references/ReferencesAction-2.html' title='References'>Links</a>
   
  <form action='http://www.javapractices.com/search/SearchAction.do' method='get' class='search-form'>
   <input type='text' name='SearchTerms' value="" size=12 maxlength=50 class='search'>
   <input type='submit' value="Search">
  </form>
 
</div>

<P>



  

 






<p class="display-messages">

 

 

</p>


<div class="main-layout">
 
   

 




<div class='page-title'>Use a fake system clock</div>

<div class='main-body'>
 
<br>


 <P>When testing an application, it's often useful to define a <i>fake system clock</i> in order 
 to exercise code that uses dates.
  
 <P>While it's always possible to change the system clock <i>directly</i>, many view that style 
 as undesirable :
 <ul>
 <li>it affects <i>all</i> programs running on a machine, and not just the application being tested
 <li>it can be time consuming or annoying to repeatedly change the system clock while testing
 </ul>

 <P>Instead of changing the system clock, it's possible to define a <i>fake</i> system clock just for your application.
 In production, the fake system clock returns normal time. 
 During testing, the fake system clock is changed to return any time you need for effective test coverage.
 Of course, your application code will always need to reference the fake system clock, and never the real one, in order for this to work.

 <P><b>Example</b>

 <P> The <tt>TimeSource</tt> interface allows you to define various implementations of a fake system clock :
<br>
<PRE>

<span class='keyword'>public</span> <span class='keyword'>interface</span> TimeSource {

  <span class='comment'>/** Return the system time. */</span>  
  <span class='keyword'>long</span> currentTimeMillis();

} 
</PRE>
<br>
 This implementation mimics a system clock running one day in advance :
<br>
<PRE>

<span class='keyword'>public</span> <span class='keyword'>final</span> <span class='keyword'>class</span> TimeSrc <span class='keyword'>implements</span> TimeSource {

  <span class='comment'>/** One day in advance of the actual time.*/</span>
  <span class='keyword'>public</span> <span class='keyword'>long</span> currentTimeMillis() {
    <span class='keyword'>return</span> System.currentTimeMillis() + ONE_DAY;
  }
  
  <span class='keyword'>private</span> <span class='keyword'>static</span> <span class='keyword'>final</span> <span class='keyword'>long</span> ONE_DAY = <span class='literal'>24</span>*<span class='literal'>60</span>*<span class='literal'>60</span>*<span class='literal'>1000</span>;

} 
</PRE>
<br>
 Using various <tt>TimeSource</tt> implementations, you can mimic any desired behavior for a system clock. 
 Possible behaviors include :
 <ul> 
  <li>skip ahead to the future
  <li>go back to the past
  <li>use a fixed date, and a fixed time
  <li>use a fixed date, but still let the time vary 
  <li>increment by one second each time you 'look' at the clock
  <li>change the <i>rate</i> at which time passes, by speeding up or slowing down by a certain factor
  <li>use the normal system clock without alteration 
 </ul> 

 <P>Remember that an application must avoid calling these items directly :
 <ul>
  <li><a href='http://java.sun.com/javase/6/docs/api/java/lang/System.html#currentTimeMillis()'>System.currentTimeMillis()</a>
  <li>the default constructor for the <a href='http://java.sun.com/javase/6/docs/api/java/util/Date.html#Date()'>Date</a> class (which in turn uses <tt>System.currentTimeMillis()</tt>)
 </ul>
 Instead, an application must reference only a <tt>TimeSource</tt>.


 <P>According to your needs, you may have to use the fake system clock in some or all of these places :
 <ul>
   <li>your application code
   <li>your logging output 
   <li>your framework classes
   <li>your database settings
 </ul>

 <P>It's simple to configure the JDK logger to use your fake system clock.
A simple custom 
<a href='http://java.sun.com/javase/6/docs/api/java/util/logging/Formatter.html'><tt>Formatter</tt></a> 
can use your <tt>TimeSource</tt> to alter the time of the <tt>LogRecord</tt>:
<br>
<PRE>

<span class='keyword'>import</span> java.util.logging.LogRecord;
<span class='keyword'>import</span> java.util.logging.SimpleFormatter;

<span class='keyword'>public</span> <span class='keyword'>final</span> <span class='keyword'>class</span> SimpleFormatterTimeSource <span class='keyword'>extends</span> SimpleFormatter {

  <span class='keyword'>@Override</span> <span class='keyword'>public</span> String format(LogRecord aLogRecord) {
    aLogRecord.setMillis(fTimeSource.currentTimeMillis());
    <span class='keyword'>return</span> <span class='keyword'>super</span>.format(aLogRecord);
  }

  <span class='keyword'>private</span> TimeSource fTimeSource = BuildImpl.forTimeSource();
}
 
</PRE>
<br>
<br>

</div>




<div class='topic-section'>See Also :</div>
<div class='main-body'>
 
  
  <a href='TopicActiond5a5-2.html?Id=33'>Use a testing framework (JUnit)</a> <br>
 
  
  <a href='TopicAction5a93-2.html?Id=237'>Plugin Factory</a> <br>
 
</div>


<div class='topic-section'>Would you use this technique?</div>
<div class='main-body'>
  
  <form action="http://www.javapractices.com/vote/AddVoteAction.do" method='post'>
    Yes<input type='radio' name='Choice' value='Y' >
    &nbsp;&nbsp;No<input type='radio' name='Choice' value='N'>
    &nbsp;&nbsp;Undecided<input type='radio' name='Choice' value="?" >
    &nbsp;&nbsp;<input type=submit value="Vote" >
    <input type='hidden' name='Operation' value='Apply'>
    <input type='hidden' name='TopicId' value='234'>
  </form>
</div>

<div style='height:10.0em;'></div>

 
 
</div>

  

 





<div align='center' class='legalese'>  
&copy; 2011 Hirondelle Systems |
<a href='../source/SourceAction-2.html'><b>Source Code</b></a><IMG class='no-margin' SRC="../images/goldstar.gif" ALT=""> |
<a href="mailto:webmaster@javapractices.com">Contact</a> |
<a href="http://creativecommons.org/licenses/by-nc-sa/1.0/">License</a> |
<a href='../apps/cjp.rss'>RSS</a>
<!-- ukey="2AC36CD2" -->
<!-- ckey="16DF3D87" -->
<br>

 Individual code snippets can be used under this <a href='../LICENSE.txt'>BSD license</a> - Last updated on June 6, 2010.<br>
 Over 150,000 unique IPs last month - <span title='Java Practices 2.6.5, Mon May 16 00:00:00 EDT 2011'>Built with</span> <a href='http://www.web4j.com/'>WEB4J</a>.<br>
 - In Memoriam : Bill Dirani -
</div>

<script src="../../www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-2633428-1";
urchinTracker();
</script>



</body>

<!-- Mirrored from www.javapractices.com/topic/TopicAction.do?Id=234 by HTTrack Website Copier/3.x [XR&CO'2010], Sun, 12 Jun 2011 17:28:08 GMT -->
<!-- Added by HTTrack --><meta http-equiv="content-type" content="text/html;charset=UTF-8"><!-- /Added by HTTrack -->
</html>
